﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
///  @brief 游戏管理类，负责游戏的核心逻辑，包括形状生成、游戏暂停与继续、以及游戏结束的处理。
/// </summary>
public class GameManager : MonoBehaviour
{
    /**
     * @brief 游戏是否处于暂停状态。
     */
    private bool isPause = true;

    /**
     * @brief 当前在游戏中的形状实例。
     */
    private Shape currentShape = null;

    /**
     * @brief 控制器类的引用，用于访问游戏的其他组件和逻辑。
     */
    private Ctrl ctrl;

    /**
     * @brief 用于持有游戏中所有形状的父Transform。
     */
    private Transform blockHolder;

    /**
     * @brief 游戏中可用的形状数组。
     */
    public Shape[] shapes;


    /**
     * @brief 游戏中可用的颜色数组。
     */
    public Color[] colors;

    /**
     * @brief Awake方法，在对象被实例化时自动调用。
     *        用于初始化控制器引用和形状持有者的Transform。
     */
    private void Awake()
    {
        Debug.Log("[GameManager] Initializing game manager...");
        ctrl = GetComponent<Ctrl>();
        blockHolder = transform.Find("BlockHolder");
        Debug.Log("[GameManager] Game manager initialization completed");
    }

    /**
     * @brief Update方法，每帧调用一次。
     *        如果游戏处于暂停状态，则直接返回；如果当前没有形状，则生成一个新的形状。
     */
    void Update()
    {
        if (isPause) return;
        if (currentShape == null)
        {
            SpawnShape();
        }
    }

    /**
     * @brief 清除当前形状的方法。
     *        如果当前有形状存在，则销毁其游戏对象，并将当前形状引用置为空。
     */
    public void ClearShape()
    {
        if (currentShape != null)
        {
            Debug.Log("[GameManager] Clearing current shape");
            Destroy(currentShape.gameObject);
            currentShape = null;
        }
    }

    /**
     * @brief 开始游戏的方法。
     *        将游戏状态设置为非暂停，并恢复当前形状（如果存在）的移动。
     */
    public void StartGame()
    {
        Debug.Log("[GameManager] Starting game");
        isPause = false;
        if (currentShape != null)
        {
            Debug.Log("[GameManager] Resuming current shape movement");
            currentShape.Resume();
        }
    }

    /**
     * @brief 暂停游戏的方法。
     *        将游戏状态设置为暂停，并暂停当前形状（如果存在）的移动。
     */
    public void PauseGame()
    {
        Debug.Log("[GameManager] Pausing game");
        isPause = true;
        if (currentShape != null)
        {
            Debug.Log("[GameManager] Pausing current shape movement");
            currentShape.Pause();
        }
    }

    /**
     * @brief 生成新形状的方法。
     *        从形状和颜色数组中随机选择一个，实例化该形状，并将其父级设置为形状持有者。
     *        然后初始化形状。
     */
    void SpawnShape()
    {
        Debug.Log("[GameManager] Spawning new shape");
        int index = Random.Range(0, shapes.Length);
        int indexColor = Random.Range(0, colors.Length);
        currentShape = GameObject.Instantiate(shapes[index]);
        Debug.Log($"[GameManager] New shape spawned at position: {currentShape.transform.position}");
        currentShape.transform.parent = blockHolder;
        currentShape.Init(colors[indexColor], ctrl, this);
        Debug.Log("[GameManager] Shape initialization completed");
    }

    /**
     * @brief 形状落下后的处理方法。
     *        将当前形状置为空，检查模型数据是否需要更新UI，并清理空的行。
     *        如果游戏结束，则暂停游戏并显示游戏结束界面。
     */
    public void FallDown()
    {
        Debug.Log("[GameManager] Shape has fallen down");
        currentShape = null;
        if (ctrl.model.isDataUpdate)
        {
            Debug.Log($"[GameManager] Updating game UI - Score: {ctrl.model.Score}, High Score: {ctrl.model.HighScore}");
            ctrl.view.UpdateGameUI(ctrl.model.Score, ctrl.model.HighScore);
        }
        foreach (Transform t in blockHolder)//如果某个掉落物的block都被消除，只剩下pivot，就把这个物体消除掉
        {
            if (t.childCount <= 1)
            {
                Debug.Log("[GameManager] Removing empty block holder");
                Destroy(t.gameObject);
            }
        }
        if (ctrl.model.IsGameOver())
        {
            Debug.Log("[GameManager] Game over detected");
            PauseGame();
            ctrl.view.ShowGameOverUI(ctrl.model.Score);
        }
    }
}